var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
// 6.引入管理员的路由
var adminRouter = require('./routes/admin')

// 1.引入对象
var { Mongoose } = require('./untils/config.js') 
// 4.引入express-session
var session = require('express-session')

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');

// 5.配置session,启动session
// Session data is not saved in the cookie itself, just the 《session ID》. Session data is stored server-side.
// 内部实现的原理：客户端保存一个cookie，服务端通过请求地址把获取cookie做一个验证的机制（得看文章）
// 会话保持的机制，session 是记录客户状态的机制，不同的是 Cookie 保存在客户端浏览器中，而 session 保存在服务器上。
app.use(session({
  secret: '$#%$%$$$', //随便写,This is the secret used to sign the session ID cookie. This can be either a string for a single secret, or an array of multiple secrets.
  name : 'sessionId',
  resave: false, //resave是指每次请求都重新设置session cookie，假设你的cookie是10分钟过期，每次请求都会再设置10分钟
  saveUninitialized: false, //saveUninitialized是指无论有没有session cookie，每次请求都设置个session cookie ，默认给个标示为 connect.sid
  cookie: { 
    maxAge : 1000*60*60   //1000ms*60*60 = 1 hour session过期时间为1小时（挺长的）
  }
}))

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
// 3.改成api2
app.use('/api2/users', usersRouter);
// 7.地址为管理员admin，上面地址为用户users
// 解释：端口设置为3000或任意，在bin/www文件中搜索3000即可，现在app.use（a,b），即http://localhost:3000/a + b中的路由跳转，例如http://localhost:3000/api2/admin/ 去到主页，/api1/是前端数据接口，/api2/是服务端接口（在前端的vue.config.js分别）
app.use('/api2/admin', adminRouter);


// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// 2.调用connect方法，连接数据库
Mongoose.connect()



// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;
